package com.sakura.oj.service;

import com.sakura.oj.model.dto.auth.AuthRequest;
import com.sakura.oj.model.enums.AuthTypeEnum;
import com.sakura.oj.model.vo.LoginUserVO;
import com.sakura.oj.utils.SpringContextUtils;

/**
 * 登录认证抽象策略类
 * 用于分发登录认证方式
 */
public interface AuthStrategy {

    /**
     * 认证方式前缀
     */
    String AUTH_BASE_KEY = "auth:";

    /**
     * 登录认证
     * 该方法用于分发认证方式，并返回登录用户信息。
     * 根据SpringContextUtils获取对应的认证方式，并调用对应的认证方法。
     *
     * @param authRequest 认证请求
     * @return token {@link String}
     */
    static String login(AuthRequest authRequest) {
        // 1. 校验authType
        AuthTypeEnum authTypeEnum = AuthTypeEnum.getEnumByValue(authRequest.getAuthType());
        // 2. 使用SpringContextUtils获取对应的认证方式
        String authBeanName = AUTH_BASE_KEY + authTypeEnum.getValue();
        AuthStrategy authStrategy = SpringContextUtils.getBean(authBeanName);
        LoginUserVO loginUserVO = authStrategy.login(authRequest.getData());
        TokenService tokenService = SpringContextUtils.getBean(TokenService.class);
        return tokenService.createToken(loginUserVO);
    }

    /**
     * 抽象认证方法
     *
     * @param data 认证数据 Json
     * @return 登录用户信息 {@link LoginUserVO}
     */
    LoginUserVO login(String data);
}
